#include <cstdio>
#include <set>
#include <iterator>

using namespace std;

struct Node
{
    int k, p;
    Node( ) { }
    Node( int _k, int _p )
        : k( _k ), p( _p ) { }
};

bool operator < ( const Node &a, const Node &b )
{
    return a.p > b.p;
}

set<Node> s;

int main( )
{
    int cmd, k, p;
    set<Node>::iterator i;
    while ( scanf("%d", &cmd) && cmd )
    {
        if ( cmd == 1 )
        {
            scanf("%d%d", &k, &p);
            s.insert( Node( k, p ) );
        }
        if ( cmd == 2 )
            if ( s.empty( ) )
                puts("0");
            else
            {
                printf("%d\n", s.begin( )->k);
                s.erase( s.begin( ) );
            }
        if ( cmd == 3 )
            if ( s.empty( ) )
                puts("0");
            else
            {
                i = s.end( );
                i--;
                printf("%d\n", i->k);
                s.erase( i );
            }
    }
    return 0;
}
